/*
 *配合asio_8做一个服务器
 */
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
//首先c相关的，其次是c++的，第三方库的，自己的头文件，倒过来可能编译快点
//同类型按照字母排列, vim->block块->sort
using boost::asio::ip::tcp;

std::string make_daytime_string() {
	using namespace std;// For time_t, time and ctime;
	//time_t now = time(0);
	auto now = time(nullptr);

	return ctime(&now); 
	// return const char*这个资源由ctime()控制，内涵一个static,多线程下不安全
	// 直接返回指针没用，所以是string 临时构造出一个
}

int main(int argc, char *argv[]) {
	try {
		boost::asio::io_service io_service;
		
		tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));
		//绑定一个端口 linux <1024 root
		std::cout << "Start service\n";
		for(;;) {
			tcp::socket socket(io_service);
			acceptor.accept(socket);
			//完成三次握手,所以不能在应用层过滤针对某些客户端服务
			//阻塞的，一次只能接受一个客户端连接
			//std::string message = make_daytime_string();
			auto message = make_daytime_string();
			
			boost::system::error_code ignored_error;
			boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
			//四次握手
			//使用同步的，
			//ignored_error，客户端异常，可以不管他，或者处理
			//但是直接停止服务不行，不写ignored_error回抛出异常，断开
		}
		//std::cout << "bye\n"; 
		//ctrl c没有打印bye，程序会发singnle信号，程序未捕捉到信号，
		//程序速死
	}catch (std::exception &e) {
		std::cerr << e.what() << std::endl;
	}
	std::cout << "bye\n";
	//在main中try-catch是个好习惯，留个全尸
	return 0;
}

